package com.wmx.apachestudy.lang;

import org.apache.commons.lang3.JavaVersion;
import org.apache.commons.lang3.SystemUtils;
import org.junit.Test;

/**
 * 在日常开发中，经常需要根据操作系统、Java版本等环境信息来执行不同的逻辑。
 * 传统的做法是使用 System.getProperty() 并记住各种晦涩的属性键名，既容易出错又难以维护。
 * 而 Apache Commons Lang 库中的 SystemUtils 工具类，正是为了解决这个痛点而生的终极解决方案！
 * <p>
 * SystemUtils 通过一系列静态常量和工具方法，提供了对 Java 系统属性的便捷访问和判断。
 * 它的核心价值在于：用易于理解的常量替代难记的属性字符串。
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2025/9/13 上午9:47
 */
public class SystemUtilsTest {

    /**
     * 系统判断
     */
    @Test
    public void testWindows() {
        System.out.println("=============testWindows===================");
        // 判断是否为Windows系统
        boolean isWindows = SystemUtils.IS_OS_WINDOWS;

        // 更具体的版本判断
        boolean isOsWindowsXp = SystemUtils.IS_OS_WINDOWS_XP;
        boolean isOsWindows7 = SystemUtils.IS_OS_WINDOWS_7;
        boolean isWin10 = SystemUtils.IS_OS_WINDOWS_10;
        boolean isOsWindows11 = SystemUtils.IS_OS_WINDOWS_11;

        System.out.println(isWindows);
        System.out.println(isOsWindowsXp);
        System.out.println(isOsWindows7);
        System.out.println(isWin10);
        System.out.println(isOsWindows11);

        System.out.println("=============testLinux===================");
        // 类Unix系统（包括Linux、macOS等）
        System.out.println(SystemUtils.IS_OS_UNIX);

        // 具体Linux发行版
        System.out.println(SystemUtils.IS_OS_LINUX);
        System.out.println(SystemUtils.IS_OS_MAC);
        System.out.println(SystemUtils.IS_OS_MAC_OSX);

        System.out.println("=============test 其他系统===================");
        // 其他系统：
        boolean isSolaris = SystemUtils.IS_OS_SOLARIS;
        boolean isSunOS = SystemUtils.IS_OS_SUN_OS;
        boolean isFreeBSD = SystemUtils.IS_OS_FREE_BSD;
        System.out.println(isSolaris);
        System.out.println(isSunOS);
        System.out.println(isFreeBSD);
    }

    /**
     * Java版本信息
     */
    @Test
    public void testVersion() {
        // Java版本字符串
        String javaVersion = SystemUtils.JAVA_VERSION;
        String javaVendor = SystemUtils.JAVA_VENDOR;
        System.out.println(javaVersion); // 1.8.0_251
        System.out.println(javaVendor); // Oracle Corporation

        // 版本号比较
        boolean isJava8 = SystemUtils.IS_JAVA_1_8;
        // Java JDK版本是否大于等于11
        boolean isJava11OrLater = SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_11);
        System.out.println(isJava8); // true
        System.out.println(isJava11OrLater); // false
    }

    /**
     * 运行时信息
     */
    @Test
    public void testPath() {
        // Java安装路径
        String javaHome = SystemUtils.JAVA_HOME;
        System.out.println(javaHome);//D:\software\Java\jdk1.8.0_251\jre

        // 类路径
        String classPath = SystemUtils.JAVA_CLASS_PATH;
        // D:\software\IDEA_2024.1\lib\idea_rt.jar;D:\software\IDEA_2024.1\plugins\junit\lib\junit5-rt.jar;......
        System.out.println(classPath);

        // 库路径
        String libraryPath = SystemUtils.JAVA_LIBRARY_PATH;
        // D:\software\Java\jdk1.8.0_251\bin;C:\WINDOWS\Sun\Java\bin;......;D:\software\IDEA_2024.1\bin;;.
        System.out.println(libraryPath);

        // 临时目录
        String tempDir = SystemUtils.JAVA_IO_TMPDIR;
        //C:\Users\A\AppData\Local\Temp\
        System.out.println(tempDir);
    }

    /**
     * 文件路径常量
     */
    @Test
    public void testFilePath() {
        // 文件路径分隔符（Windows是";"，Unix是":"）
        String pathSeparator = SystemUtils.PATH_SEPARATOR;
        System.out.println(pathSeparator);

        // 文件分隔符（Windows是"\"，Unix是"/"）
        String fileSeparator = SystemUtils.FILE_SEPARATOR;
        System.out.println(fileSeparator);

        // 换行符（跨平台兼容）
        String lineSeparator = SystemUtils.LINE_SEPARATOR;
        System.out.println(lineSeparator);
    }

    /**
     * 用户信息
     */
    @Test
    public void testUser() {
        // 当前用户信息
        String userName = SystemUtils.USER_NAME;
        String userHome = SystemUtils.USER_HOME;
        String userDir = SystemUtils.USER_DIR;  // 当前工作目录
        String userCountry = SystemUtils.USER_COUNTRY;
        String userLanguage = SystemUtils.USER_LANGUAGE;
        String userTimezone = SystemUtils.USER_TIMEZONE;

        System.out.println(userName); // A
        System.out.println(userHome); // C:\Users\A
        System.out.println(userDir); // E:\IDEA_Projects\apache-study
        System.out.println(userCountry);// CN
        System.out.println(userLanguage); // zh
        System.out.println(userTimezone);// Asia/Shanghai

        Runtime runtime = Runtime.getRuntime();
        System.out.println("CPU核数：" + runtime.availableProcessors());
    }

}
